package main

import (
	"database/sql"
	"fmt"
	"github.com/pkg/errors"
)

func mockError() error {
	return sql.ErrNoRows
}

// 模拟用户的结构

type Data struct {
	ID   int
	Name string
}

type UserDao struct{}

func (d *UserDao) FindById(data *Data) error {

	// 模拟调用sql出错
	err := mockError()

	if err == sql.ErrNoRows {
		return errors.Wrapf(err, "无法找到, id: %v", data.ID)
	}

	if err != nil {
		return errors.Wrapf(err, "查询出错, id: %v", data.ID)
	}

	// do something

	return nil
}

type UserBiz struct {
	User *UserDao
}

func (b *UserBiz) FindById(data *Data) error {

	err := b.User.FindById(data)

	if err != nil {
		return errors.WithMessage(err, "查询出错")
	}

	// do something

	return nil
}

func main() {

	userDao := &UserDao{}

	userBiz := &UserBiz{User: userDao}

	data := &Data{ID: 1}

	err := userBiz.FindById(data)

	if err != nil {
		fmt.Printf("查找失败, %+v", err)
		return
	}

	fmt.Printf("找到, %+v", data)
}
